﻿using Arim.S4.Api;
using Arim.S4.Client.Base.Dto;
using System;
using System.Collections.Generic;
using System.Linq;

namespace Arim.S4.Client.Service
{
    public class JobPlanAppService : BaseAppService<JobPlanDto, JobPlanQueryDto>
    {
        public JobPlanAppService() : base(Urls.JOB_PLANS.BASE) { }

        /// <summary>
        /// 获取最近时间的生产排程计划。
        /// </summary>
        /// <param name="time">开始时间</param>
        /// <returns></returns>
        public IList<JobPlanDto> GetLatestJobPlans(DateTime time)
        {
            // Rank=1保证获得的排程计划是成组的。
            return this.GetAll(new JobPlanQueryDto { Start = time, Rank = 1 });
        }

        /// <summary>
        /// 获取某个炉次的生产排程。
        /// </summary>
        /// <param name="heatNo"></param>
        /// <returns></returns>
        public IList<JobPlanDto> GetJobPlansByHeatNo(string heatNo)
        {
            return this.GetAll(new JobPlanQueryDto { HeatNo = heatNo });
        }

        public IList<JobItemDto> Mes(JobItemQueryDto query = null)
        {
            return this.BuildRestApi<JobItemDto>().GetList(Urls.JOB_PLANS.MES, query);
        }

        /// <summary>
        /// 获取首次调度结果，可能为空。客户端使用定时器刷新获取该结果。
        /// </summary>
        public IList<JobItemDto> First()
        {
            return this.BuildRestApi<JobItemDto>().GetList(Urls.JOB_PLANS.FIRST);
        }

        /// <summary>
        /// 调用后台智能模型的调度结果，可能为空。客户端使用定时器刷新获取该结果。
        /// </summary>
        public IList<JobItemDto> Fresh()
        {
            return this.BuildRestApi<JobItemDto>().GetList(Urls.JOB_PLANS.FRESH);
        }

        /// <summary>
        /// 启动智能调度。启动后客户端使用定时器调用 Fresh()方法获取调度结果，直到不为空为止。
        /// </summary>
        public void Run()
        {
            this.RestApi.Get(Urls.JOB_PLANS.RUN);
        }

        /// <summary>
        /// 获取一个炉次的历史实绩信息。
        /// </summary>
        /// <param name="heatNo">炉次号</param>
        /// <returns></returns>
        public IList<HeatHistoryDto> GetHeatHistory(string heatNo)
        {
            return this.BuildRestApi<HeatHistoryDto>().GetPagedList(Urls.MACHINES.HISTORY, new PageDto(), new { HeatNo = heatNo })?.Items;
        }

        /// <summary>
        /// 用户确认甘特图的排产计划并保存到后台，保存后可能会有新的炉次号。
        /// 后台只会保存状态为NotStarted的作业，其他状态不会保存。
        /// </summary>
        /// <param name="jobs"></param>
        /// <returns></returns>
        public IList<JobItemDto> Save(IList<JobItemInput> jobs)
        {
            var items = jobs.Select(s => s.ToJobItemDto());
            return this.BuildRestApi<JobItemDto>().PostMany(Urls.JOB_PLANS.SAVE, items);
        }
    }
}
